package LimitedTimeGame.Day_0303;

/**
 * @author zxc
 * @date 2023/03/03 09:18
 **/

import java.util.HashSet;

/**
 * 题目 ：保证文件名唯一
 * 题目详述 ：
 * 给你一个长度为 n 的字符串数组 names 。你将会在文件系统中创建 n 个文件夹：在第 i 分钟，新建名为 names[i] 的文件夹。
 * 由于两个文件 不能 共享相同的文件名，因此如果新建文件夹使用的文件名已经被占用，
 * 系统会以 (k) 的形式为新文件夹的文件名添加后缀，其中 k 是能保证文件名唯一的 最小正整数 。
 * 返回长度为 n 的字符串数组，其中 ans[i] 是创建第 i 个文件夹时系统分配给该文件夹的实际名称。
 *
 * 提示：
 * 1 <= names.length <= 5 * 10^4
 * 1 <= names[i].length <= 20
 * names[i] 由小写英文字母、数字和/或圆括号组成。
 *
 */
public class GetFolderNames {
    /**
     * 思路 ：
     * ===》
     * 即，使用Set集合去保存names中的所有字符串;
     * （1）逐个遍历names中的字符串，同时去判断Set集合中是否出现正在遍历的字符串;
     * （2）若是该Set集合中不存在该字符串的话，则选择将该字符串直接加入到 结果字符串数组中;
     * （3）若是该Set集合中存在该字符串的话，则遍历获取能够保证文件名唯一的 最小正整数;
     * ===》
     * 会导致超出内存限制;
     * @param names
     * @return
     */
    public String[] getFolderNames(String[] names) {
        HashSet<String> set = new HashSet<>();
        int len = names.length;
        set.add(names[0]);
        String[] result = new String[len];
        result[0] = names[0];
        int k = 1;
        for(int i = 1 ; i < len ; i++){
            if(set.contains(names[i])){
                for(int j = 1 ; ;j++){
                    String str = names[i] + "(" + j + ")";
                    if(!set.contains(str)){
                        set.add(str);
                        result[k++] = str;
                        break;
                    }
                }
            }
            else {
                set.add(names[i]);
                result[k++] = names[i];
            }
        }
        return result;
    }
}
